package com.syf.rocker;


import com.syf.domain.store.BsSoftwareRelease;
import com.syf.mail.QQMail;
import com.syf.model.Mails;
import com.syf.service.BsSoftwareReleaseService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.stereotype.Service;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 【2】消费者--监听MQ中的队列，有消息则消费：
 */
@Service
@Slf4j
public class MessageConsumerListener {

    @Autowired
    private QQMail qqMail;  //ringBuffer 队列

    @Autowired
    private BsSoftwareReleaseService bsSoftwareReleaseService;

    /**
     * 【2】消费者--监听MQ中的队列，有消息则消费
     *      异常：RocketMQ Message hasn't been sent. Caused by No route info of this topic, mail_queue
     *      原因(注册不到该topic)：
     *          MQ启动失败/掉了
     *          消息队列名称设置错了(消费者的binding 要与 destination目的地一致)、
     *          配置文件MQ的地址映射名写错 -> 连接不到正确的MQ地址
     *
     */
    @StreamListener("mail_in")  //本地消息Bean的一个对象(Sink中@Input定义的消息队列--监听指定队列)
    public void handleMessage(Mails mails) {
        System.out.println("MQ 消费消息(发生邮箱):" + mails.toString());
        qqMail.sendMessage(mails.getTo(),mails.getMsg(),mails.getSubject());
    }


    /**
     * 下载软件--更新软件下载次数
     * @param id
     */
    @StreamListener("download_in")  //本地消息Bean的一个对象(Sink中@Input定义的消息队列--监听指定队列)
    public void handleMessage(Integer id) {
        System.out.println("MQ 消费消息(下载软件):" + id);
        BsSoftwareRelease software = bsSoftwareReleaseService.getById(id);
        AtomicInteger atomicInteger = new AtomicInteger(software.getDownloadSize());
        int downloadSize = atomicInteger.addAndGet(1);
        software.setDownloadSize(downloadSize);
        boolean update = bsSoftwareReleaseService.updateById(software);
        log.info("下载次数更新结果：{}，下载了{}次", update, downloadSize);
    }
}
